# 导入一整个类.
import string
import urllib.request
# 只导入某一个方法.
from urllib.parse import quote

import pymysql
from bs4 import BeautifulSoup


# 封装一个去除空格和换行的方法.
def nospace(world):
    return world.strip().replace(" ", "").replace("\n", " ")


city = input("请输入城市：")
code = {
    '北京': '530',
    '上海': '538',
    '广州': '763',
    '深圳': '765',
    '天津': '531',
    '武汉': '736',
    '西安': '854',
    '成都': '801',
    '沈阳': '599',
    '南京': '635',
    '杭州': '653',
    '苏州': '639',
    '重庆': '551',
    '长沙': '749',
    '厦门': '682',
    '南昌': '691'
}
# 将用户输入的城市替换成对应的城市代码.比如:输入,北京:转换为530
city = code[city]
type = input("请输入岗位：")
# 进行字符串的拼接,完成最终爬取的地址.
# url参数为城市地址与岗位.
url = "https://sou.zhaopin.com/?jl=" + city + "&kw=" + type + "&p=1"
# 如果url中需要有空格,则需要手动的转义,用%20 来代表空格.
# 如果url中需要中文,则需要通过quote进行转义,不然会报错.
# url中允许使用的字符有 数字,英文字母，一些特殊的符号.
# -_~! 键盘能够输入的符号,基本都支持.
url = quote(url, safe=string.printable)
res = urllib.request.urlopen(url)
print(url)
# read()取出网页的源代码(byte类型的数据)
# 可以通过decode()转换成uft-8.
# 网页源代码不包括js处理后的数据.
content = res.read().decode()
# print(content)

# 通过BeautifulSoup对象来解析我们得到的页面内容.
# ToDO:同时需要安装解析器,推荐使用lxml. (这个解析器需要手动导入)
soup = BeautifulSoup(content, "lxml")

# 通过select方法通过类名来获取数据.(拿到所有的存放数据的div)
jobItem = soup.select(".joblist-box__item")
print(jobItem)
# 这个是用来存放所需数据的列表.
job_list = []
for job in jobItem:
    # 先创建一个字典.
    job_dic = {}
    # get_text() 用来获取所有的文本内容,但是是以字符串列表的方式显示.
    # getText() 用来获取所有的文本的内容,但是会拼接成一个字符串显示.
    job_name = job.select(".jobinfo__name")[0].get_text()
    job_sal = job.select(".jobinfo__salary")[0].get_text()
    # 用来处理工资左右两边的空格,以及内容之间的空格,最后还有换行.
    # job_sal = job_sal.strip().replace(" ", "").replace("\n", " ")
    job_sal = nospace(job_sal)
    print(job_sal)
    if '天' in job_sal:
        # 这里我们取小工资.
        job_sal = int(job_sal.split("-")[0]) * 30
    elif ('千' in job_sal):
        job_sal = int(job_sal.split('千')[0]) * 1000
    elif ('万' in job_sal):
        # 注意小数的问题.
        job_sal = float(job_sal.split('万')[0]) * 10000
    else:
        job_sal = 5000
    # 拿到公司名称.
    company_name = nospace(job.select(".companyinfo__name")[0].get_text())
    # 工作地点
    # 同时获取工作地点的三条信息.
    # 这里是一个大的idv里面有三条数据.
    job_msg = job.select(".jobinfo__other-info-item")
    # 工作地点 切片([0:2]是一个左闭右开的[0,2))
    job_place = nospace(job_msg[0].get_text())[0:2]
    # 工作经验
    job_exp = nospace(job_msg[1].get_text())
    # 学历要求
    job_education = nospace(job_msg[2].get_text())
    # 将获取的数据全部放入字典.
    job_dic["job_name"] = job_name
    job_dic["job_sal"] = job_sal
    job_dic["company_name"] = company_name
    job_dic["job_place"] = job_place
    job_dic["job_exp"] = job_exp
    job_dic["job_education"] = job_education
    print(job_dic)
    # 将job.dic加入到job_list
    job_list.append(job_dic)

# 创建数据库的连接.
db = pymysql.connect(
    host="localhost",
    user="root",
    password="123456",
    database="crawlerdemo",
    charset='utf8'
)

# 获取操作游标.
cursor = db.cursor()
# 遍历job_list
for job in job_list:
    # 将获取到的数据全部存入数据库.
    sql = ("insert into job values(null,'%s','%s','%s','%s','%s','%s')"
           % (job["job_name"], job["job_sal"], job["company_name"], job["job_place"],
              job["job_exp"], job["job_education"]))
    # 执行sql语句.
    try:
        cursor.execute(sql)
    except Exception as e:
        print(e)
        print("插入数据失败!")
        db.rollback()
# 全部插入完之后手动提交.
db.commit()
# 关闭资源
cursor.close()
db.close()
